package com.example.im.core.singleton;

import com.example.im.core.vo.ClientInfo;
import com.example.im.core.vo.UserInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * SocketIOClient缓存单例管理类
 *
 */
public class ClientInfoManager {

	private final Logger LOG = LoggerFactory.getLogger(ClientInfoManager.class);
	
	//已连接的客户端(所有)
    private static Map<String, ClientInfo> clientMap = new ConcurrentHashMap<>();
    
    //所有用户信息（包括客户和客服）
    private static Map<String, UserInfo> userInfoMap = new ConcurrentHashMap<>();
    

	/** 
	*  饿汉式单例模式，类加载器加载时就有了本类的一个实例,提高了系统效率
	*/  
	private static ClientInfoManager instance = new ClientInfoManager();  
    
	/**
	 * 私有的构造函数，防止被任意调用，保证本类在整个项目中只能有一个实例
	 */
    private ClientInfoManager() {
    	initUserInfo();
    }
    
    /**
     * 这里提供了一个供外部调用本 class的静态方法,可以直接访问
     * @return
     */
    public static ClientInfoManager getInstance() {
    	
    	return instance;
    }
    
    /**
     *  新增或者修改ClientInfo
     * @param key
     * @param value
     * @return
     */
    public boolean addOrUpdateClientInfo(String key, ClientInfo value) {
        boolean flag = false;
        try {
        	clientMap.put(key, value);
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
            LOG.error("本地缓存新增或者修改SocketIOClient出错，异常信息：{}，堆栈信息：{}",e.getMessage(),e);
            return false;
        }
        return flag;
    }
    
    /**
     * 获取ClientInfo
     * @param key
     * @return
     */
    public ClientInfo getClientInfo(String key) {
    	ClientInfo clientInfo = clientMap.get(key);
        if (clientInfo != null) {
            return clientInfo;
        } else {
            return null;
        }
    }
    
    /**
     * 删除ClientInfo
     * @param key
     * @return
     */
    public boolean removeClientInfo(String key) {
        boolean flag = false;
        try {
        	clientMap.remove(key);
            flag = true;
        } catch (Exception e) {
        	LOG.error("本地缓存刪除SocketIOClient出错，异常信息：{}，堆栈信息：{}",e.getMessage(),e);
            return false;
        }
        return flag;
    }

    /**
     *  初始化用户信息
     */
    private static void initUserInfo() {
    	UserInfo u1 = new UserInfo();
    	UserInfo u2 = new UserInfo();
    	UserInfo k1 = new UserInfo();

    	u1.setId("u1");
    	u1.setName("用户1");

    	u2.setId("u2");
    	u2.setName("用户2");

    	k1.setId("k1");
    	k1.setName("客服1");

    	userInfoMap.put("u1", u1);
    	userInfoMap.put("u2", u2);
    	userInfoMap.put("k1", k1);
    }

    
}
